Documentation Index
Fetch the complete documentation index at: https://docs.olostep.com/llms.txt
Use this file to discover all available pages before exploring further.
Attraverso l’endpoint Olostep /v1/monitors puoi creare monitor persistenti che funzionano secondo un programma fisso, rilevano modifiche alle pagine e ti notificano via email, webhook o SMS.
- Crea un monitor da una
query in linguaggio naturale
- Esegui controlli utilizzando programmi in linguaggio naturale
- Invia avvisi tramite
email, webhook_url o phone_number (SMS)
- Elenca, ispeziona, aggiorna, metti in pausa, riprendi e elimina monitor
- Leggi eventi snapshot del monitor da snapshot privati
Per impostazione predefinita, ogni esecuzione del monitor cattura un snapshot completo della pagina monitorata — un’immagine completa del suo stato attuale in quel momento. Se vuoi che il monitor mostri solo ciò che è nuovo o cambiato tra le esecuzioni (delta) invece dello stato completo, devi esprimere tale intento direttamente nella query.
Installazione
# pip install requests
import requests
Crea un monitor
Crea un monitor con POST /v1/monitors. L’endpoint convalida il tuo input, fornisce il monitor, crea il suo programma interno e restituisce un oggetto monitor attivo.
query è obbligatoria. Se la tua query include un URL, il monitor si concentrerà su quell’URL di input. Per impostazione predefinita, ogni esecuzione prende un’istantanea completa di ciò che viene monitorato — un’immagine dello stato attuale della pagina. Se vuoi che il monitor tracci solo ciò che è nuovo o cambiato tra le esecuzioni (ad esempio, solo nuovi post sul blog, o solo cali di prezzo), devi specificarlo esplicitamente nella query; altrimenti viene catturata l’istantanea completa ad ogni esecuzione.
frequency accetta istruzioni di programma in linguaggio naturale e predefinisce UTC quando non viene fornito alcun fuso orario.
- È richiesto esattamente un obiettivo di notifica:
email, webhook_url o phone_number (SMS).
- Usa
output_schema quando vuoi risultati di estrazione strutturati. (opzionale)
Esempio di richiesta
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
payload = {
"query": "Traccia le modifiche su https://example.com/products/widget-pro per informazioni sui prezzi e sulle scorte",
"frequency": "ogni giorno alle 9am America/Los_Angeles",
"email": "alerts@example.com",
"output_schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"published_at": {"type": "string"}
},
"required": ["title"]
},
"metadata": {
"product_id": "widget-pro",
"team": "growth"
}
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(f"{API_URL}/monitors", headers=headers, json=payload)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Risposta
La creazione del monitor avvenuta con successo restituisce HTTP 202 con un oggetto monitor:
{
"id": "monitor_n8q2x4m1ak",
"object": "monitor",
"created_at": 1777983215,
"updated_at": 1777983222,
"fda_id": "fda_n8q2x4m1ak",
"team_id": "team_n8q2x4m1ak",
"status": "active",
"query": "Traccia le modifiche su https://example.com/products/widget-pro per informazioni sui prezzi e sulle scorte",
"frequency": "ogni giorno alle 9am America/Los_Angeles",
"cron_expression": "0 0 * * ? *",
"notification_channel": "email",
"notification_target": "alerts@example.com",
"output_schema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"published_at": { "type": "string" }
},
"required": ["title"]
},
"metadata": {
"product_id": "widget-pro",
"team": "growth"
}
}
Output strutturato del monitor
Imposta output_schema nella richiesta di creazione quando vuoi che i risultati di estrazione del monitor seguano una struttura JSON specifica. Lo schema deve essere un JSON Schema valido.
Canali di notifica
I monitor supportano un canale per monitor:
email: imposta un campo email
webhook: imposta un campo webhook_url
sms: imposta un campo phone_number (formato E.164, ad esempio +14155552671)
Puoi impostare esattamente uno di questi campi per richiesta.
Esempio di Webhook
{
"query": "Osserva le modifiche su https://example.com/terms termini legali",
"frequency": "ogni giorno alle 10:00 am",
"webhook_url": "https://hooks.example.com/olostep-monitor"
}
Esempio di SMS
{
"query": "Osserva le modifiche su https://example.com/terms termini legali",
"frequency": "ogni giorno alle 10:00 am",
"phone_number": "+14155552671"
}
Frequenze
Imposta frequency in linguaggio naturale, ad esempio:
ogni giorno alle 9am America/Los_Angeles
ogni 5 minuti
ogni 6 ore
L’API interpreta questo testo di programmazione e deriva automaticamente l’espressione cron. Se non viene fornito alcun fuso orario, viene utilizzato UTC per impostazione predefinita.
Elenca i monitor
Recupera tutti i monitor per il tuo team con GET /v1/monitors.
Per impostazione predefinita, i monitor eliminati sono filtrati. Usa ?include_deleted=true per includerli.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.get(f"{API_URL}/monitors", headers=headers)
result = response.json()
print(f"Total monitors: {result['count']}")
print(json.dumps(result, indent=2))
Forma della risposta
{
"monitors": [
{
"id": "monitor_a3yk6z49p8",
"object": "monitor",
"created_at": 1777983215,
"cron_expression": "13 13 * * ? *",
"fda_id": "fda_a3yk6z49p8",
"frequency": "daily",
"metadata": {},
"notification_channel": "email",
"notification_target": "example@olostep.com",
"query": "Raccogli i nuovi post del blog dal sito web di esempio e inviami aggiornamenti con i nuovi post.",
"status": "active",
"team_id": "team_a3yk6z49p8F",
"updated_at": 1777983222
}
],
"count": 1
}
Ottieni un monitor
Recupera un singolo monitor con GET /v1/monitors/:monitor_id.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.get(f"{API_URL}/monitors/{MONITOR_ID}", headers=headers)
print(json.dumps(response.json(), indent=2))
Forma della risposta
{
"id": "monitor_a3yk6z49p8",
"object": "monitor",
"created_at": 1777983215,
"cron_expression": "13 13 * * ? *",
"fda_id": "fda_a3yk6z49p8",
"frequency": "daily",
"metadata": {},
"notification_channel": "email",
"notification_target": "example@olostep.com",
"query": "Raccogli i nuovi post del blog dal sito web di esempio e inviami aggiornamenti con i nuovi post.",
"status": "active",
"team_id": "team_a3yk6z49p8",
"updated_at": 1777983222
}
Elenca gli eventi del monitor
Usa GET /v1/monitors/:monitor_id/events per elencare gli eventi snapshot per un monitor.
Questo endpoint supporta la paginazione:
limit (predefinito 25, max 100)
cursor (token di paginazione opaco da una risposta precedente)
Gli eventi vengono restituiti dal più recente. Ogni elemento include un snapshot_url pre-firmato a breve durata per consentirti di recuperare in modo sicuro il contenuto dello snapshot privato.
Esempio
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.get(
f"{API_URL}/monitors/{MONITOR_ID}/events?limit=10",
headers=headers
)
print(json.dumps(response.json(), indent=2))
Forma della risposta
{
"data": [
{
"id": "run_v7k2p9m3",
"run_id": "run_v7k2p9m3",
"created": 1777960800,
"changed": true,
"summary": "Il prezzo è cambiato da $49 a $45 e la disponibilità è passata a bassa.",
"snapshot_url": "https://olostep-monitor-snapshot.s3.amazonaws.com/private/key?...signature..."
}
],
"has_more": false,
"next_cursor": null
}
Se cursor è malformato, l’endpoint restituisce:
{
"error": "Invalid cursor."
}
Aggiorna un monitor
Aggiorna un monitor con POST /v1/monitors/:monitor_id.
Aggiornamenti supportati:
metadata (unito ai metadati esistenti; passa valori stringa vuoti per eliminare le chiavi)
frequency (testo di programmazione in linguaggio naturale, ad esempio ogni giorno feriale alle 08:30 America/New_York)
Se aggiorni frequency, l’API ricrea internamente il programma del monitor. Se non è incluso alcun fuso orario nel testo, viene utilizzato UTC.
Esempio di richiesta
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
payload = {
"frequency": "ogni 2 ore",
"metadata": {
"owner": "ops-team",
"deprecated_field": ""
}
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(
f"{API_URL}/monitors/{MONITOR_ID}",
headers=headers,
json=payload
)
print(json.dumps(response.json(), indent=2))
Metti in pausa un monitor
Metti in pausa un monitor con POST /v1/monitors/:monitor_id/pause.
Mettere in pausa disabilita il programma sottostante del monitor in modo che non vengano attivate ulteriori esecuzioni, e imposta lo status del monitor su paused. La riga del monitor, la sua configurazione e i suoi snapshot passati vengono mantenuti — solo le esecuzioni programmate future si fermano. Puoi riprendere il monitor successivamente con POST /v1/monitors/:monitor_id/resume.
Solo i monitor con status di active possono essere messi in pausa. Il corpo della richiesta è vuoto.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.post(f"{API_URL}/monitors/{MONITOR_ID}/pause", headers=headers)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Risposta
In caso di successo, restituisce 200 con il monitor e status impostato su paused:
{
"id": "monitor_n8q2x4m1ak",
"object": "monitor",
"status": "paused",
"updated_at": 1777986822,
"query": "Traccia le modifiche su https://example.com/products/widget-pro per informazioni sui prezzi e sulle scorte",
"frequency": "ogni giorno alle 9am America/Los_Angeles",
"notification_channel": "email",
"notification_target": "alerts@example.com"
}
Possibili risposte di errore:
400 — monitor_id malformato, monitor già deleted, monitor non attualmente active, o monitor non ha un programma sottostante.
404 — Monitor non trovato.
409 — Il monitor ha cambiato stato durante il tentativo di pausa (non più active), o il programma sottostante non è stato trovato.
Riprendi un monitor
Riprendi un monitor in pausa con POST /v1/monitors/:monitor_id/resume.
Riprendere riabilita il programma sottostante del monitor e imposta lo status del monitor di nuovo su active. Le esecuzioni programmate continuano sulla frequency esistente — non è necessaria la ricreazione del programma.
Solo i monitor con status di paused possono essere ripresi. Il corpo della richiesta è vuoto.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.post(f"{API_URL}/monitors/{MONITOR_ID}/resume", headers=headers)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Risposta
In caso di successo, restituisce 200 con il monitor e status impostato di nuovo su active:
{
"id": "monitor_n8q2x4m1ak",
"object": "monitor",
"status": "active",
"updated_at": 1777990422,
"query": "Traccia le modifiche su https://example.com/products/widget-pro per informazioni sui prezzi e sulle scorte",
"frequency": "ogni giorno alle 9am America/Los_Angeles",
"notification_channel": "email",
"notification_target": "alerts@example.com"
}
Possibili risposte di errore:
400 — monitor_id malformato, monitor già deleted, monitor non attualmente paused, o monitor non ha un programma sottostante.
404 — Monitor non trovato.
409 — Il monitor ha cambiato stato durante il tentativo di ripresa (non più paused), o il programma sottostante non è stato trovato.
Elimina un monitor
Elimina un monitor con DELETE /v1/monitors/:monitor_id.
L’eliminazione è soft per la riga del monitor (status diventa deleted) e rimuove anche le risorse di programmazione/agent-ombra interne legate a quel monitor.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
MONITOR_ID = "monitor_n8q2x4m1ak"
headers = {
"Authorization": f"Bearer {API_KEY}"
}
response = requests.delete(f"{API_URL}/monitors/{MONITOR_ID}", headers=headers)
print(json.dumps(response.json(), indent=2))
Esempi di casi d’uso
Di seguito sono riportati esempi pratici di richieste per l’endpoint /v1/monitors.
Traccia problemi di uptime nell’API OpenAI
Esegui un controllo orario che osserva lo stato dell’API OpenAI e ti invia un’email quando vengono rilevati problemi di uptime.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
payload = {
"query": "Traccia problemi di uptime nell'API OpenAI e inviami un'email a info@olostep.com",
"frequency": "ogni ora",
"email": "alerts@example.com"
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(f"{API_URL}/monitors", headers=headers, json=payload)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Traccia recensioni di prodotti — snapshot completo per esecuzione
Monitora una pagina di prodotto e invia ogni recensione a un webhook ad ogni esecuzione. Poiché la query non chiede di deduplicare rispetto alle esecuzioni precedenti, ogni esecuzione cattura un snapshot completo delle recensioni attualmente sulla pagina (comportamento predefinito). Usa questo schema quando vuoi lo stato completo ogni volta, ad esempio per sovrascrivere una tabella a valle.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
payload = {
"query": "Monitora le recensioni di questo prodotto https://www.walmart.com/reviews/product/957245477?sort=submission-desc e notificami tramite webhook. Per ogni recensione estrai la data di pubblicazione, l'autore, il voto, il titolo e il contenuto del testo.",
"frequency": "ogni giorno alle 9am",
"webhook_url": "https://webhook.site/3fb2b00b-d66f-4c46-b778-f0c7b93d4d86",
"output_schema": {
"type": "object",
"properties": {
"reviews": {
"type": "array",
"items": {
"type": "object",
"properties": {
"publication_date": {"type": "string"},
"author": {"type": "string"},
"rating": {"type": "number"},
"title": {"type": "string"},
"text_content": {"type": "string"}
}
},
"required": [
"publication_date",
"author",
"rating",
"title",
"text_content"
]
}
}
}
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(f"{API_URL}/monitors", headers=headers, json=payload)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Traccia solo i nuovi annunci di affitto — delta dall’esecuzione precedente
Monitora una ricerca di affitti paginata ed esegui una pipeline multi-step che mostra solo gli annunci appena apparsi rispetto all’esecuzione precedente, quindi arricchisce e valuta ciascuno prima di notificare il webhook. L’intero workflow — paginazione, rilevamento di nuovi annunci rispetto al checkpoint precedente, arricchimento di ciascun nuovo annuncio con segnali di criminalità per la sua posizione, assegnazione di un punteggio complessivo da 1 a 10 basato su prezzo/posizione/sicurezza, persistenza dello stato e notifica — è espresso direttamente come passaggi ordinati nella query. Poiché i passaggi in linguaggio naturale descrivono sia l’estrazione che la logica delta, non è richiesto alcun output_schema: la query da sola determina cosa viene recuperato, confrontato, arricchito, valutato e consegnato.
import requests
import json
API_KEY = "<YOUR_API_KEY>"
API_URL = "https://api.olostep.com/v1"
payload = {
"query": "Monitora le prime 3 pagine di https://streeteasy.com/for-rent/new-jersey/price:1000-1750?sort_by=listed_desc, rileva solo gli annunci appena apparsi rispetto al checkpoint precedente, arricchisci ciascun nuovo annuncio con segnali di criminalità per la sua posizione, assegna un punteggio complessivo da 1 a 10 basato su prezzo/posizione/sicurezza, persisti lo stato e notifica tramite webhook.",
"frequency": "ogni ora",
"webhook_url": "https://webhook.site/3fb2b00b-d66f-4c46-b778-f0c7b93d4d86"
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(f"{API_URL}/monitors", headers=headers, json=payload)
print(response.status_code)
print(json.dumps(response.json(), indent=2))
Errori comuni di validazione
Gli endpoint del monitor restituiscono errori di validazione chiari per richieste non valide comuni:
query mancante
frequency mancante, o istruzione di programma non valida
- Mancanza di tutti
email, webhook_url e phone_number
- Fornire più di uno tra
email, webhook_url e phone_number nella stessa richiesta
- Formato email non valido
- URL webhook non valido (deve essere
http o https)
- Formato numero di telefono non valido (deve essere E.164, ad esempio
+14155552671)
output_schema non valido (deve essere un JSON Schema valido)
- Formato
monitor_id non valido
Esempio di errore:
{
"error": "Invalid frequency. Provide a natural-language schedule instruction."
}