Skip to Content

Automatizări

Ce primește sistemul dumneavoastră de la o automatizare, cererea API ca utilizator Flux de lucru și structura unui flux

Ultima actualizare la

Automatizările lasă Tillor să execute singur acțiuni, cum ar fi crearea de sarcini sau apelarea sistemului dumneavoastră. Explicația pentru utilizatori se află la Automatizări. Această pagină descrie ce vede un integrator: mesajul pasului Trimite webhook, Cererea API către un URL propriu sau către API-ul Tillor și cum este construit un flux dacă îl gestionați prin API.

Trimite webhook

Pasul Trimite webhook livrează un mesaj propriu către unul dintre webhook-urile organizației. Este aceeași livrare ca la evenimentele webhook obișnuite, cu aceeași semnătură.

Mesajul

Pasul face un POST cu Content-Type: application/json și aceste anteturi:

AntetConținut
X-Webhook-Event-IDUn ID unic pentru această livrare. La reîncercări valoarea rămâne aceeași, deci puteți elimina dublurile pe baza ei
X-Webhook-Signaturesha256=<hex>, HMAC-SHA256 al corpului cu secretul de semnare al webhook-ului

Corpul are același plic ca payload-ul webhook:

{
  "event": "automation.invoice_unpaid",
  "data": {
    "invoice": "2026-0042",
    "amountOutstanding": 125.5
  },
  "timestamp": 1735689600000,
  "traceId": "0b0f7c0e-5d3c-4c1e-9b8a-7f1e2a3b4c5d",
  "triggeredBy": null
}
CâmpDescriere
eventNumele evenimentului pe care l-ați completat în pas. Orice text este permis, numele nu trebuie să se afle în lista de chei de eveniment
dataPayload-ul din pas, după completarea variabilelor, ca JSON
timestampTimpul Unix în milisecunde al livrării
traceIdUn UUID aleatoriu pentru fiecare livrare. Spre deosebire de evenimentele din sistem, acesta nu este un id de urmărire al unei acțiuni Tillor
triggeredByÎntotdeauna null

Nu există spanId. Webhook-ul nu trebuie să fie abonat la o cheie de eveniment: un mesaj dintr-o automatizare este livrat întotdeauna la endpoint-ul ales, cât timp acesta există și este activat.

Cum verificați semnătura se află la Verificarea semnăturii.

Încercări și rezultat

Tillor face în cadrul pasului până la 5 încercări, cu 1, 2, 4 și 8 secunde de așteptare între ele. O încercare contează ca reușită la un status 2xx. Și o țintă blocată, de exemplu o adresă internă, contează ca încercare eșuată.

  • Dacă una dintre încercări reușește, fluxul continuă prin ieșirea Reușit
  • Dacă toate cinci eșuează, fluxul continuă prin Eșuat. Mesajul este apoi încercat din nou în fundal conform programului de la Comportamentul livrării și reîncercări. Dacă o încercare ulterioară reușește, aceasta nu mai apare în execuție, deoarece aceasta și-a continuat deja drumul

Dacă webhook-ul nu mai există sau este dezactivat, pasul nu trece prin Eșuat. Execuția se oprește atunci cu statusul Eșuat.

Cerere API către un URL propriu

Cu Cerere API și Trimite către pe URL personalizat, o automatizare trimite o cerere HTTP către serverul dumneavoastră.

ElementComportament
MetodăGET, POST, PUT, PATCH sau DELETE
URLTrebuie să înceapă cu https://. Variabilele sunt completate codificate
CorpJSON. Nu se trimite la GET și DELETE. Cu corp, Tillor setează Content-Type: application/json
AnteturiLa alegere liberă. Valorile pot conține variabile. Host, Content-Length, Transfer-Encoding și Connection sunt ignorate
ȚintăAdresele private și interne sunt refuzate, chiar dacă un nume de domeniu obișnuit trimite către ele
RedirecționăriNu sunt urmate. Un răspuns 3xx contează ca eșuat
Timp limită15 secunde

Fără semnătură

Spre deosebire de Trimite webhook, Tillor nu semnează această cerere. Dacă doriți să verificați că o cerere vine de la automatizarea dumneavoastră, puneți un secret într-un antet și verificați-l pe partea dumneavoastră. Antetele sunt stocate criptat, deci o cheie sau un token din ele este în siguranță.

Un răspuns cu status 2xx continuă prin Reușit, orice alt status prin Eșuat. Dacă serverul nu poate fi atins sau depășește timpul limită, execuția se oprește cu statusul Eșuat.

Cerere API către API-ul Tillor

Cu Trimite către pe Tillor API, automatizarea apelează API-ul propriei organizații. Indicați doar o cale, de exemplu /tasks, iar Tillor o plasează după /api/orgs/{orgId}. Referința API se află la OpenAPI.

  • Identitate: cererea este executată ca utilizatorul Flux de lucru al organizației. Acesta are toate permisiunile în acea organizație și nicăieri altundeva. Modificările apar deci pe numele Flux de lucru
  • Nu este nevoie de cheie: Tillor face apelul singur, fără cheie API și fără a trece prin internet
  • Cale: trebuie să înceapă cu un singur /. //, .. și \ nu sunt permise. Un șir de interogare este permis, de exemplu /tasks?terrainId=…&limit=1. Variabilele din cale sunt completate codificate
  • Blocat: căile /automations și /automation-runs sunt refuzate, chiar și cu un șir de interogare, litere mari, un / final sau codificare procentuală. O automatizare nu poate gestiona automatizări
  • Corp: JSON, pentru POST, PUT și PATCH. La GET și DELETE nu se trimite
  • Meniu de alegere: în editor se află Alege un endpoint API, cu operațiunile din specificația OpenAPI. Operațiunile interne nu apar acolo. Dacă alegeți una, Tillor completează metoda, calea și un corp de exemplu
  • Eșec: un răspuns 2xx continuă prin Reușit. Un status de eroare, inclusiv un 404 pentru o cale care nu există, trece prin Eșuat

Răspunsul în pașii următori

După cerere sunt disponibile aceste variabile:

VariabilăConținut
{response.status}Codul de status HTTP
{response.body}Primele 4000 de caractere ale răspunsului, ca text
{response.data}Răspunsul ca JSON. null dacă nu este JSON sau dacă este mai lung de 100.000 de caractere. Listele le adresați cu un index, de exemplu {response.data.items.0.id}

O a doua cerere API din același flux înlocuiește response. Variabilele funcționează ca la Variabile și șabloane.

Structura unui flux

Puteți crea și modifica automatizări și prin API. Operațiunile se află în OpenAPI sub eticheta automations. Citirea cere permisiunea automations:read, crearea și modificarea automations:write (sau toate permisiunile). Utilizatorul Flux de lucru însuși nu le poate apela niciodată. Poate fi mai practic să construiți un flux în editor și să-l citiți ca exemplu.

O automatizare nouă este întotdeauna dezactivată. Activarea prin enabled nu reușește cât timp fluxul are probleme deschise, iar un flux activat nu poate fi salvat cu probleme.

definition constă din pași (nodes), linii (edges) și, opțional, observații (notes). Maximum 100 de pași, 200 de linii și 50 de observații.

{
  "nodes": [
    {
      "id": "trigger",
      "type": "trigger",
      "label": "",
      "position": { "x": 0, "y": 0 },
      "config": { "source": "event", "eventKey": "occupation:ended" }
    },
    {
      "id": "task",
      "type": "taskCreate",
      "label": "",
      "position": { "x": 0, "y": 190 },
      "config": { "title": "Controleer {occupation.terrain.name}", "priority": "HIGH" }
    }
  ],
  "edges": [
    { "id": "trigger:out:task", "source": "trigger", "target": "task", "sourceHandle": "out" }
  ],
  "notes": [
    {
      "id": "note_1",
      "text": "Maakt na elk vertrek een controletaak.",
      "position": { "x": 340, "y": 0 },
      "width": 240,
      "height": 140
    }
  ]
}

O observație (notes) este o explicație pe canvas. Nu este niciodată executată și nu are linii. text are maximum 2000 de caractere, width și height sunt în pixeli.

O linie are un sourceHandle: ieșirea pasului din care pornește.

Pas (type)Ieșiri (sourceHandle)
trigger, delay, waitUntilOpen, waitUntilClosed, taskCreate, taskSetStatus, taskSetPriority, taskUpdate, invoiceReminderSend, invoiceSend, invoicePrint, occupationExtendInvoice, staffNotify, commentCreate, inboxReply, inboxTag, customerUpdate, accessMethodCreate, accessMethodUpdate, accessMethodSendQr, accessPointControl, meterSwitch, nfcTagUpdate, deviceCommand, deviceDisplay, deviceSlideshow, controllerRelay, controllerCommandout
customerMessageSend, reservationSetStatus, invoiceBook, paymentLinkCreate, mandateRequest, mandateCollect, consumptionInvoiceout, skipped
conditionyes, no
switchid-ul fiecărei ramuri, plus default
openingHoursopen, closed
throttlepass, blocked
taskFind, documentFind, recordLookupfound, notFound
forEacheach, done
waitUntilmet, timeout
waitForEventreceived, timeout
approvalapproved, rejected, timeout
webhookSend, httpRequestsuccess, failed

Fiecare acțiune, cu excepția webhookSend și httpRequest, primește o ieșire suplimentară error de îndată ce continueOnError din config este true. Fără această setare, o acțiune eșuată oprește execuția. Cu această setare, fluxul continuă prin error, cu {error.message} și {error.step} ca variabile pentru pașii următori. Ieșirea skipped se folosește când un pas nu a avut nimic de făcut, iar out este atunci ieșirea obișnuită.

La forEach, ieșirea each pornește pentru fiecare element o execuție proprie pentru pașii următori, iar ieșirea done este continuarea obișnuită a fluxului însuși.

O ieșire poate duce către mai mulți pași. Execuția continuă singură cu prima linie și pornește pentru fiecare altă linie o execuție proprie cu aceleași date, care rulează în paralel (ca ieșirea each a lui forEach). Liniile care formează un ciclu sunt refuzate în editor. Un flux are exact un trigger.

Setări pe pas

Câmpurile de sub config sunt câmpurile din editor. Câmpurile de text acceptă variabile între acolade.

PasCâmpuri în config
triggersource (event, webhook, invoiceOverdue, dateReached, daily sau cron), webhookVersion (la webhook: text, măriți-l pentru a înlocui adresa), eventKey, date (la dateReached: o cale record.veld către o coloană DateTime a unui model pe care un eveniment îl trimite complet, cum ar fi reservation.checkIn sau contact.birthday, sau către o cheie de dată declarată într-o coloană JSON, cum ar fi document.userMetadata.insuranceExpiryDate; nume vechi precum reservationCheckIn continuă să funcționeze), dateOffset ({ "amount", "unit" }), dateDirection (before sau after), dateTime (exact: ora din dată, sau fixed: ziua calendaristică a datei în fusul orar al organizației, cu dateHour și dateMinute, text precum "9" și "0"; decalajul se numără pe ceas, deci și peste trecerea la ora de vară și de iarnă), repeatYearly (boolean: contează doar ziua și luna, în fiecare an), hour și minute (text, de exemplu "8" și "0", minutul de la 0 la 59), cron (cinci câmpuri; ziua săptămânii poate fi 1#2 sau 1L, un al șaselea câmp W2:2026-10-05 repetă la fiecare două săptămâni), conditions, oncePerRecord (boolean)
conditionconditions
switchfield (o cale de variabilă fără acolade), cases: o listă de { "id", "key", "value" } cu key ca nume al ramurii și value ca valoare cu care câmpul trebuie să fie egal. Maximum 8 ramuri
delaymode (duration sau untilDate), duration și offset ca { "amount", "unit" } cu unit fiind seconds, minutes, hours, days sau weeks, dateField (cale de variabilă), direction (before sau after)
taskCreatetitle, description, assigneeIds, labelIds, assignActor, priority (LOW, MEDIUM, HIGH sau URGENT), viewId, laneId, subtasks (una pe rând), dueIn ({ "amount", "unit" }), linkRecords
taskSetStatustaskId, status (PENDING, IN_PROGRESS, WAITING sau COMPLETED)
taskFindtitle (titlu exact), linkedToRecords, onlyOpen, onlyTopLevel (boolean)
documentFindcustomerId (șablon), documentType (INSURANCE_POLICY, INSURANCE_PAYMENT_PROOF, IDENTITY_CARD, SEPA_MANDATE, OTHER sau gol), onlyActive, onlyValid (boolean). Rezultatul se află sub foundDocument
documentUpdatedocumentId (șablon), documentType (gol păstrează tipul), status (ACTIVE, ARCHIVED sau gol)
taskSetPrioritytaskId, mode (raise, lower sau set), priority (la set), maxPriority (la raise)
taskUpdatetaskId, title, assigneeIds, assignActor, assigneeMode (add sau replace), labelIds, dueIn ({ "amount", "unit" } cu unit fiind minutes, hours, days sau weeks)
invoiceReminderSend, invoiceSend, invoiceBookinvoiceId
invoicePrintinvoiceId, printer (a4, pos sau tablet)
paymentLinkCreateinvoiceId, method (any, BANCONTACT, IDEAL, CREDITCARD sau PAYCONIQ)
mandateRequestcustomerId, mode (request sau reminder)
mandateCollectinvoiceId, delayDays (text, implicit "0", cel mult 7)
consumptionInvoicecustomerId, sendEmail, sendSms
occupationExtendInvoiceoccupationId, includeConsumption
customerMessageSendcustomerId, subject, body, sendEmail, sendSms, sendWhatsApp
staffNotifyuserIds, notifyActor, title, body, sendPush, sendEmail
commentCreatecontent, target (event sau task), taskId (la task)
inboxReplythreadId, body, keepAssistant
inboxTagthreadId, tagIds, archive
customerUpdatecustomerId, status (keep, DEFAULT, PREFERRED, VIP, WARNING sau BLACKLISTED), notes
reservationSetStatusreservationId, action (checkIn, checkOut sau cancel)
accessMethodCreatecustomerId, type (QR_CODE, LPR, PIN_CODE sau NFC), value, periodFrom, periodTo (variabile cu o dată, gol înseamnă fără limită)
accessMethodUpdatescope (one sau customer), accessMethodId (la one), customerId (la customer), status (keep, ACTIVE, SOFT_BLOCKED, BLOCKED sau INACTIVE), periodTo
accessMethodSendQraccessMethodId, sendEmail, sendSms, sendWhatsApp, print (none, label sau thermal)
accessPointControlaccessPointId, action (open sau close)
meterSwitchtarget (terrain sau meter), terrainId (la terrain), meterId (la meter), state (on sau off)
nfcTagUpdatecustomerId, action (block, unblock, topUp sau lowBalance), amount (la topUp, în euro per tag)
deviceCommanddeviceId, command (wake, sleep, reload, identify, testSound sau playSound), url (la playSound: calea unui sunet încărcat, așa cum o completează editorul, sau un link https către un fișier mp3, wav sau m4a)
deviceDisplaykind (pdf sau image), url (link https). Apare pe fiecare tabletă setată ca display, cum ar fi un PDF de factură
controllerRelaytarget (controller sau event: controllerul evenimentului controller:input:changed care a pornit fluxul), controllerId (la controller), relay (text "1" până la "6"), action (pulse, on sau off), durationSeconds (la pulse, text, de la 0.001 la 3600 cu zecimale precum "0.5"; releul se deschide singur la loc)
controllerCommandtarget și controllerId ca la controllerRelay, command (reboot, rebootExtension, otaUpdate, forceOtaUpdate, extensionOtaUpdate sau refreshSettings)
deviceSlideshowscope (displays sau device), mode (screensaver sau background), source (feed sau urls). La feed: itemsPath, imageField, opțional câmpuri de filtrare și sortare
openingHours, waitUntilOpen, waitUntilClosedFără câmpuri
throttlewindow ({ "amount", "unit" } cu unit fiind minutes, hours, days sau weeks), key (gol înseamnă per înregistrare care a pornit fluxul)
recordLookupmodel (Customer, Reservation, Occupation, Invoice, Payment, Terrain, Task, Document, AccessMethod, NfcTag, Meter, InboxThread sau InboxMessage), recordId. Rezultatul se află sub found plus modelul, cum ar fi foundCustomer
forEachsource (customerAccessMethods, customerNfcTags, customerOpenInvoices, customerUpcomingReservations, customerOccupations, customerDocuments (doar ACTIVE) sau terrainMeters), parentId (id-ul clientului sau al terenului). Cel mult 100 de elemente, elementul se află sub item
waitUntilconditions, interval și timeout ({ "amount", "unit" } cu unit fiind minutes, hours, days sau weeks; intervalul este de cel puțin 5 minute)
waitForEventeventKey, sameRecord (boolean), timeout ({ "amount", "unit" })
approvaltitle, description, assigneeIds, timeout ({ "amount", "unit" }). Sarcina se află sub approvalTask.id
Fiecare acțiune, cu excepția webhookSend și httpRequestcontinueOnError (boolean)
webhookSendwebhookId, event, payload (JSON ca text)
httpRequesttarget (tillor sau custom), method, path (la tillor), url (la custom), headers (listă de { "id", "key", "value" }), body (JSON ca text)

conditions are forma { "match": "all" sau "any", "rules": [...] }. Fiecare regulă este { "id", "field", "operator", "value", "values" }. operator este is, isNot, contains, greaterThan, lessThan, isOneOf, isEmpty sau isNotEmpty. values îl folosiți doar la isOneOf. O listă goală de reguli lasă totul să treacă.

Pornirea unei automatizări cu un webhook

O automatizare cu trigger webhook pornește la un POST către propria adresă:

curl -X POST "https://tillor.eu/api/orgs/org_abc123/automation-hooks/aut_xxx/<token>?bron=website" \
  -H "Content-Type: application/json" \
  -d '{"email":"jan@voorbeeld.nl","aankomst":"2026-07-14"}'
  • Adresa completă se află în editor la trigger, sau prin GET /automations/{id}/webhook-url (cu automations:read). Tokenul este secretul; un antet pentru autentificare nu este necesar
  • Corpul JSON devine variabila body, șirul de interogare query, iar momentul receivedAt
  • Răspuns 200 cu { "accepted": true } de îndată ce execuția a pornit. O adresă greșită, înlocuită sau dezactivată dă 404, un corp de peste 100 KB dă 400
  • Multe apeluri la scurt timp unul după altul nu sunt refuzate: fiecare apel valid pornește o execuție. Folosiți Ignoră repetările la trigger dacă același apel poate sosi de două ori, vezi Ignoră repetările

O automatizare nu își poate apela propriul webhook printr-o Cerere API către API-ul Tillor.

Alegerea unei decizii prin API

Sarcina unui pas Cere o decizie are câte o acțiune pentru fiecare opțiune pe care ați setat-o în pas. Preluați sarcina pentru a vedea actions cu id-ul lor și alegeți una cu POST /tasks/{id}/actions/{actionId}/choose. Dacă opțiunea cere o notă, trimiteți-o ca { "note": "..." }. Alegerea este definitivă: finalizează sarcina și continuă automatizarea pe ieșirea acelei opțiuni. Colegii desemnați (și printr-un grup) și administratorii pot alege. Vezi OpenAPI pentru detalii.

Citiți mai departe

A fost utilă această pagină?

Pe această pagină