[{"data":1,"prerenderedAt":94},["ShallowReactive",2],{"docs:it:webhooks":3},{"id":4,"meta":5,"intro":8,"contractVersion":11,"contractVersionLabel":12,"contractNotice":13,"contractDownload":14,"labels":17,"sections":29},"webhooks",{"title":6,"lead":7},"Webhook","Gli avvisi di fallimento spinti su un canale tuo: come registrarne uno, che cosa esce e perché non porta una firma.",{"title":9,"lead":10},"Webhook di avviso","Un secondo canale per l’avviso che un cronjob è fallito, accanto all’email e mai al suo posto.","1.15.0","Versione del contratto","Il riferimento qui sotto è letto dal contratto OpenAPI, che è scritto in inglese. Non è tradotto di proposito: tradurlo vorrebbe dire ricopiarlo, e una copia prima o poi diverge.",{"href":15,"label":16},"\u002Fopenapi.json","Scarica il contratto pubblico (OpenAPI, JSON)",{"method":18,"path":19,"summary":20,"scope":21,"authentication":22,"form":23,"name":24,"type":25,"notes":26,"description":27,"downloadContract":16,"contractVersion":12,"command":28},"Metodo","Percorso","Che cosa fa","Ambito della chiave","Accetta","Sulla richiesta","Nome","Tipo","Note","Descrizione","Comando",[30,38,44,56,86],{"id":31,"title":32,"paragraphs":33,"block":37},"overview","Che cos’è un webhook qui",[34,35,36],"Registri un indirizzo https; quando un cronjob è fallito in modo definitivo, gli mandiamo un POST. Slack e Discord leggono un campo solo e ricevono una riga di testo; qualunque altro bersaglio riceve il JSON descritto più sotto.","Il canale è tuo e non del workspace. Due persone della stessa squadra hanno due destinazioni diverse, e nessun ruolo — nemmeno Admin — può leggere quella di un altro membro. Un cronjob che fallisce deve svegliare chi è di turno.","È un canale in più, mai un canale al posto di: l’email resta accesa per impostazione predefinita, perché altrimenti un webhook che smette di funzionare spegnerebbe gli avvisi senza dirlo.",null,{"id":39,"title":40,"paragraphs":41,"block":37},"configuration","Registrare e ispezionare un canale",[42,43],"Un canale si registra, si elenca e si rimuove dalla dashboard, e quelle rotte non stanno in questa pagina perché nessuna chiave le raggiunge. Vogliono una sessione e non una chiave API, e l’asimmetria è deliberata: una chiave capace di sostituire l’indirizzo di un webhook potrebbe dirottare gli avvisi del workspace su una destinazione sua — scoprendo quali cronjob falliscono, e quando — mentre chi lo possiede continua a vedere un canale che sembra configurato.","Nessuna rotta restituisce mai un indirizzo, nemmeno i suoi ultimi caratteri. A identificare un canale in un elenco sono il nome che hai scelto e l’host.",{"id":45,"title":46,"paragraphs":47,"block":50},"events","Gli eventi che escono",[48,49],"The events that may leave towards an external webhook. There is one, and it is what R29 asks for: \"failure notifications\".","Plan changes, welcomes and account security events stay out on purpose. A Slack channel is shared and sits outside our perimeter: those events concern a person and their relationship with us, and announcing them in a shared channel would hand them to colleagues who have nothing to do with it. Security is the least obvious of the four — an unauthorised sign-in is *the* thing one would want to know quickly — and it stays out because to be useful it would have to say *what* happened to the account, and that, in a channel, is an invitation.",{"kind":51,"definitions":52},"definitions",[53],{"name":54,"type":55,"description":55},"job_failed","",{"id":57,"title":58,"paragraphs":59,"block":63},"body","Che cosa porta il corpo",[60,61,62],"L’elenco è completo: è letto dalla struttura che produce quel JSON, quindi non può essere più corto di ciò che parte. I campi marcati come facoltativi mancano quando non hanno niente da dire.","Ciò che non c’è non è una dimenticanza. Non c’è il testo dell’errore, non c’è il corpo della risposta, non c’è l’URL del bersaglio — perché possono citare un indirizzo che contiene i segreti del workspace già risolti — non c’è un indirizzo email e non c’è l’identificativo di una persona. Un canale condiviso sta fuori dal nostro perimetro, e un POST non può portare ciò che la struttura non ha.","The body shape the target expects. It decides only the shape, never the destination: webhook sends the payload as JSON to any compatible endpoint.",{"kind":51,"definitions":64},[65,69,72,74,76,79,82,84],{"name":66,"type":67,"description":68},"event","string","always present",{"name":70,"type":67,"description":71},"job_id","optional",{"name":73,"type":67,"description":71},"job_name",{"name":75,"type":67,"description":71},"environment",{"name":77,"type":78,"description":71},"failures","integer",{"name":80,"type":81,"description":71},"last_attempt_at","string (date-time)",{"name":83,"type":67,"description":71},"failure_kind",{"name":85,"type":78,"description":71},"http_status",{"id":87,"title":88,"paragraphs":89,"block":37},"signature","Firma e verifica",[90,91,92,93],"Non c’è una firma, e non c’è un’intestazione da verificare. L’indirizzo è la credenziale: i token di Slack e di Discord stanno nel suo percorso, ed è per questo che si accetta solo https, che l’indirizzo è cifrato a riposo e che nessuna rotta te lo rilegge.","Ciò su cui puoi contare al suo posto è poco e vale la pena saperlo. La chiamata arriva su TLS e si presenta come Postqron-Alerts\u002F1. Nessun redirect viene mai seguito: un 3xx è una risposta finale, e non riuscita, quindi nulla può dirottare altrove il corpo dopo la partenza.","Se ti serve la certezza che una chiamata sia nostra, metti un segreto tuo nel percorso dell’indirizzo che registri e verificalo all’arrivo. È la stessa proprietà che ti avrebbe dato la firma, e funziona già oggi.","Una consegna che non riesce non è un silenzio: è una riga con il suo motivo e con lo stato dell’ultima risposta, leggibile nella dashboard accanto al canale. Dopo abbastanza fallimenti consecutivi il canale viene sospeso, con la ragione allegata.",1788438713237]