Webhook-uri
Trimiteți fiecare răspuns la o adresă a dvs., ca JSON, în clipa în care sosește.
Un POST pentru fiecare răspuns
Trimis imediat ce răspunsul este stocat, fără să îl țină pe respondent în așteptare.
O structură JSON stabilă
Nume publice de tipuri și ID-uri permanente de câmpuri, așa că redenumirea unei întrebări nu vă strică niciodată codul.
10 secunde, o singură încercare
Fillio așteaptă zece secunde răspunsul endpointului dvs. și nu mai încearcă a doua oară.
Activarea unui webhook
Deschideți formularul, mergeți la fila Setări și porniți Webhook. Lipiți adresa care ar trebui să primească trimiterile; Fillio o salvează la scurt timp după ce vă opriți din scris și v-o confirmă pe ecran. Fiecare formular poartă o singură adresă, iar oprirea comutatorului o șterge.
Adresa trebuie să fie HTTPS
Fillio apelează numai adrese care încep cu https://. O adresă http:// este acceptată de câmpul din setări, dar nu este apelată niciodată, așa că un webhook care pare salvat nu va livra nimic, în tăcere.
Sunt refuzate și adresele care duc într-o rețea privată: orice gazdă din 10.x, 127.x, 169.254.x, 172.16-31.x sau 192.168.x, orice adresă IPv6 și orice nume care este localhost sau se termină în .local ori .internal. Endpointul dvs. trebuie să fie accesibil din internetul public.
Cererea
Un POST cu corp JSON. Îl însoțesc patru anteturi.
| Antet | Descriere |
|---|---|
| Content-Type: application/json | Corpul este întotdeauna JSON. |
| User-Agent: Fillio Webhooks/1.0 | Identifică apelantul ca fiind Fillio, ceea ce ajută atunci când un singur endpoint ascultă mai multe servicii. |
| X-Fillio-Event: FORM_RESPONSE | Numele evenimentului. FORM_RESPONSE este singura valoare pe care Fillio o trimite astăzi. |
| X-Fillio-Event-Id | Un UUID nou pentru această livrare, repetat ca eventId în corp. |
Payloadul
Un plic care descrie evenimentul și un obiect data care descrie răspunsul.
{
"eventId": "8f2c1d7a-4b09-4e5c-9a13-6d0f8b2e77c4",
"eventType": "FORM_RESPONSE",
"createdAt": "2026-08-26T09:14:22.481Z",
"data": {
"responseId": "Qh3Rk9wZm1sVtY7cN2xP",
"formId": "7bTn4Kq2Wx",
"formName": "Workshop signup",
"createdAt": "2026-08-26T09:14:22.481Z",
"fields": [
{
"key": "V1StGXR8_Z5jdHi6B-myT",
"label": "Full name",
"type": "INPUT_TEXT",
"value": "Mira Kaya"
},
{
"key": "kM4pQz7LxAe2Rn0BsTvUw",
"label": "Which session?",
"type": "MULTIPLE_CHOICE",
"value": "c9XbNf3JdQ",
"options": [
{ "id": "c9XbNf3JdQ", "text": "Morning" },
{ "id": "eR2mYt8KpL", "text": "Afternoon" }
]
},
{
"key": "zA6cWn1FyH4tXd9QrLbEs",
"label": "How likely are you to recommend us?",
"type": "LINEAR_SCALE",
"value": 9
}
]
}
}| Proprietate | Descriere |
|---|---|
| eventId | Un ID unic pentru această livrare. |
| eventType | Întotdeauna FORM_RESPONSE. |
| createdAt | Momentul trimiterii răspunsului, ca marcaj temporal ISO 8601 în UTC. |
| data.responseId | ID-ul răspunsului stocat. |
| data.formId | ID-ul formularului, același care apare în linkul lui public. |
| data.formName | Titlul formularului ca text simplu, fără formatare. |
| data.fields | Câte o intrare pentru fiecare întrebare la care s-a răspuns. |
În interiorul fields
Fiecare intrare poartă patru proprietăți, iar o întrebare cu opțiuni poartă și o a cincea.
| Proprietate | Descriere |
|---|---|
| key | ID-ul permanent al întrebării. Supraviețuiește oricărei modificări a textului, așa că potriviți-vă după el, nu după etichetă. |
| label | Întrebarea, așa cum este scrisă în editor. |
| type | Tipul întrebării, luat din lista de mai jos. |
| value | Răspunsul, în forma în care îl stochează acea întrebare. |
| options | Doar la întrebările cu opțiuni: ID-ul și textul fiecărei opțiuni, ca să puteți transforma un răspuns înapoi într-o etichetă. |
Sosesc doar întrebările la care s-a răspuns
O întrebare pe care respondentul nu a atins-o lipsește din listă, în loc să fie trimisă ca valoare goală, iar o întrebare ascunsă de logica condițională nu apare deloc. Căutați fiecare răspuns după key, în loc să vă bazați pe poziție sau pe un număr fix de intrări.
Răspunsurile de tip alegere poartă ID-uri, nu etichete
Răspunsul la o listă derulantă sau la un radio este ID-ul opțiunii alese, iar răspunsul la o casetă de bifat, la o selecție multiplă sau la un clasament este o listă de ID-uri de opțiuni. Rezolvați-le prin lista options din aceeași intrare. Un răspuns de tip clasament păstrează ordinea în care respondentul a așezat elementele.
Opțiunea Altele
Când un respondent scrie într-o casetă Altele, valoarea nu este un ID de opțiune, ci textul __OTHER__: urmat de ce a scris. Îndepărtați acest prefix ca să citiți răspunsul.
"value": "__OTHER__:Heard about it from a friend"Fișiere și semnături
Răspunsul la o încărcare de fișier este un link de descărcare către fișierul din spațiul de stocare al Fillio. Un răspuns de tip semnătură este un data URL PNG în base64, pe care îl puteți salva sau afișa direct.
Tipuri de câmpuri
Tipul este un nume public stabil, așa că o schimbare din interiorul Fillio nu ajunge niciodată la integrarea dvs. Orice nu poate fi mapat de Fillio sosește ca INPUT_TEXT.
| Tip | Întrebare | Valoare |
|---|---|---|
| INPUT_TEXT | Răspuns scurt | Text |
| TEXTAREA | Răspuns lung | Text |
| INPUT_EMAIL | Text | |
| INPUT_PHONE_NUMBER | Număr de telefon | Text |
| INPUT_NUMBER | Număr | Numărul ca text, exact așa cum a fost scris |
| INPUT_LINK | Link | Text |
| INPUT_DATE | Dată | O dată, ca YYYY-MM-DD |
| INPUT_TIME | Oră | O oră, ca HH:MM, pe ceas de 24 de ore |
| DROPDOWN | Listă derulantă | Un ID de opțiune |
| MULTIPLE_CHOICE | Radio | Un ID de opțiune |
| CHECKBOXES | Casetă de bifat | O listă de ID-uri de opțiuni |
| MULTI_SELECT | Selecție multiplă | O listă de ID-uri de opțiuni |
| RATING | Evaluare cu stele | Un număr |
| LINEAR_SCALE | Scală liniară | Un număr |
| RANKING | Clasament | O listă de ID-uri de opțiuni, în ordinea respondentului |
| FILE_UPLOAD | Încărcare fișier | Un link de descărcare |
| SIGNATURE | Semnătură | Un data URL PNG în base64 |
Dacă endpointul dvs. nu răspunde
Fillio așteaptă zece secunde. O expirare, o eroare de conexiune sau orice status din afara intervalului 2xx contează ca livrare eșuată, și cu asta se încheie: nu există nicio reîncercare și nicio coadă din care să reluați.
Răspunsul în sine nu este afectat niciodată. Este stocat înainte ca cererea să fie făcută și rămâne în tabloul dvs. de bord orice ar face endpointul, așa că tabloul de bord rămâne evidența completă chiar dacă o livrare se pierde.
Nu există semnătură
Fillio nu semnează cererea și nu trimite niciun secret comun, așa că, de una singură, cererea nu dovedește de unde vine. Dacă endpointul dvs. trebuie să fie sigur, dați-i o adresă pe care numai dvs. o știți: o cale sau un șir de interogare lung, imposibil de ghicit. Tratați ca nesigur orice ajunge altundeva.
Fiecare livrare poartă propriul ID de eveniment, atât în antetul X-Fillio-Event-Id, cât și în corp. Să rețineți ID-urile pe care le-ați tratat deja este cel mai simplu mod de a face endpointul sigur la un apel repetat.
Îndreptați webhook-ul spre orice endpoint de inspectat cereri și trimiteți-vă o dată propriul formular. Veți vedea exact payloadul pe care îl produce formularul dvs., cu propriile ID-uri de câmpuri. Este cel mai rapid mod de a scrie maparea de partea dvs.