Webhooks

Skicka varje inskickat svar till en adress du väljer själv, som JSON, i samma stund det kommer in.

En POST per svar

Skickas så fort svaret har sparats, utan att respondenten behöver vänta.

En stabil JSON-struktur

Publika typnamn och permanenta fält-ID:n, så att en omdöpt fråga aldrig bryter din kod.

10 sekunder, ett försök

Fillio väntar tio sekunder på din endpoint och försöker inte igen efteråt.

Slå på en webhook

Öppna formuläret, gå till fliken Inställningar och slå på Webhook. Klistra in adressen som ska ta emot svaren; Fillio sparar den en stund efter att du slutat skriva och bekräftar den på skärmen. Varje formulär bär en adress, och att slå av reglaget igen rensar den.

Adressen måste vara HTTPS

Fillio anropar bara adresser som börjar med https://. En http://-adress accepteras av inställningsfältet men anropas aldrig, så en webhook som ser ut att vara sparad levererar i tysthet ingenting.

Adresser som pekar in i ett privat nätverk avvisas också: alla värdar på 10.x, 127.x, 169.254.x, 172.16-31.x eller 192.168.x, alla IPv6-adresser, och alla namn som är localhost eller slutar på .local eller .internal. Din endpoint måste vara nåbar från det öppna internet.

Anropet

En POST med en JSON-kropp. Fyra headers följer med.

HeaderBeskrivning
Content-Type: application/jsonKroppen är alltid JSON.
User-Agent: Fillio Webhooks/1.0Identifierar anroparen som Fillio, vilket är användbart när en endpoint lyssnar på flera tjänster.
X-Fillio-Event: FORM_RESPONSEHändelsens namn. FORM_RESPONSE är det enda värde Fillio skickar i dag.
X-Fillio-Event-IdEtt nytt UUID för den här leveransen, upprepat som eventId i kroppen.

Nyttolasten

Ett kuvert som beskriver händelsen, och ett data-objekt som beskriver svaret.

{
  "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
      }
    ]
  }
}
EgenskapBeskrivning
eventIdEtt unikt ID för den här leveransen.
eventTypeAlltid FORM_RESPONSE.
createdAtNär svaret skickades in, som en ISO 8601-tidsstämpel i UTC.
data.responseIdID:t för det sparade svaret.
data.formIdFormulärets ID, samma som förekommer i dess publika länk.
data.formNameFormulärets titel som ren text, utan formatering.
data.fieldsEn post per besvarad fråga.

Inuti fields

Varje post bär fyra egenskaper, och en fråga med alternativ bär en femte.

EgenskapBeskrivning
keyFrågans permanenta ID. Det överlever varje ändring av formuleringen, så matcha på det i stället för på etiketten.
labelFrågan så som den är skriven i redigeraren.
typeFrågetypen, hämtad från listan nedan.
valueSvaret, i den form frågan sparar det.
optionsBara på frågor med alternativ: varje alternativs ID och text, så att du kan omvandla ett svar tillbaka till en etikett.

Bara besvarade frågor kommer med

En fråga respondenten lämnade orörd saknas i listan i stället för att skickas som ett tomt värde, och en fråga som dolts av villkorslogik dyker aldrig upp alls. Slå upp varje svar på dess key i stället för att förlita dig på position eller på ett fast antal poster.

Valsvar bär ID:n, inte etiketter

Ett svar på en rullgardinsmeny eller ett flerval är det valda alternativets ID, och ett svar på kryssrutor, flervalslista eller rangordning är en lista med alternativ-ID:n. Lös upp dem mot options-listan i samma post. Ett rangordningssvar behåller ordningen respondenten satte objekten i.

Alternativet Övrigt

När en respondent skriver i en Övrigt-ruta är värdet inte ett alternativ-ID utan texten __OTHER__: följd av det de skrev. Ta bort det prefixet för att läsa svaret.

"value": "__OTHER__:Heard about it from a friend"

Filer och signaturer

Ett svar på en filuppladdning är en nedladdningslänk till filen i Fillios lagring. Ett signatursvar är en base64-PNG som data-URL, som du kan spara eller visa direkt.

Fälttyper

Typen är ett stabilt publikt namn, så en ändring inuti Fillio når aldrig din integration. Allt Fillio inte kan mappa kommer fram som INPUT_TEXT.

TypFrågaVärde
INPUT_TEXTKort svarText
TEXTAREALångt svarText
INPUT_EMAILE-postText
INPUT_PHONE_NUMBERTelefonnummerText
INPUT_NUMBERNummerTalet som text, exakt som det skrevs
INPUT_LINKLänkText
INPUT_DATEDatumEtt datum, som YYYY-MM-DD
INPUT_TIMETidEn tid, som HH:MM på en 24-timmarsklocka
DROPDOWNRullgardinsmenyEtt alternativ-ID
MULTIPLE_CHOICERadioknappEtt alternativ-ID
CHECKBOXESKryssrutaEn lista med alternativ-ID:n
MULTI_SELECTFlervalEn lista med alternativ-ID:n
RATINGStjärnbetygEtt tal
LINEAR_SCALELinjär skalaEtt tal
RANKINGRangordningEn lista med alternativ-ID:n, i respondentens ordning
FILE_UPLOADFiluppladdningEn nedladdningslänk
SIGNATURESignaturEn base64-PNG som data-URL

Om din endpoint inte svarar

Fillio väntar tio sekunder. En timeout, ett anslutningsfel eller en status utanför 2xx-intervallet räknas som en misslyckad leverans, och där tar det slut: det finns inget nytt försök och ingen kö att spela upp från.

Själva svaret påverkas aldrig. Det sparas innan anropet görs och ligger kvar i din kontrollpanel oavsett vad din endpoint gör, så kontrollpanelen förblir det fullständiga registret även om en leverans går förlorad.

Det finns ingen signatur

Fillio signerar inte anropet och skickar ingen delad hemlighet, så kroppen i sig bevisar inte varifrån den kom. Om din endpoint måste vara säker, ge den en adress bara du känner till: en lång, ogissbar sökväg eller frågesträng. Betrakta allt som kommer in någon annanstans som opålitligt.

Varje leverans bär sitt eget händelse-ID, både i headern X-Fillio-Event-Id och i kroppen. Att anteckna vilka du redan har hanterat är det enklaste sättet att göra din endpoint säker att anropa två gånger.

Tips

Peka webhooken mot vilken tjänst som helst som visar inkommande anrop och skicka in ditt eget formulär en gång. Du ser exakt den nyttolast ditt formulär producerar, med dina egna fält-ID:n i. Det är det snabbaste sättet att skriva mappningen på din sida.