π¦Payload & headers reference
The exact JSON body and HTTP headers Dapta Forms sends to a webhook: form, submission, data and utm objects, the partial or complete phase, the x-forms-event, x-forms-delivery, x-forms-timestamp and X
Every webhook delivery is a POST with a JSON body in one stable shape. This page documents that shape field by field, the headers that travel with it, and what is different in a test delivery. You can see the exact body of any past delivery in the Webhook history dialog under What we sent.

Sample body
The shape below is real; the values are made up. Keys inside data are your own Field keys from the Build tab.
Fields
id
string
The idempotency key of this delivery, the same value as the x-forms-delivery header. Format submission:{submissionId}:{phase}:webhook:{index}. Store it and ignore a second request with the same id.
type
string
Always form.submission.
phase
string
partial when the respondent passed the partial submit point, complete when they finished. One session can produce both, in that order.
submittedAt
string
ISO-8601 timestamp (UTC) of this phase.
form.id
string
The form's ID.
form.name
string
The form's name at the time of sending.
submission.id
string
The submission's ID. Identical for the partial and the complete delivery of the same session, which is how you link them.
submission.sessionId
string
The respondent's session.
submission.score
number
Total score from the scoring settings, recomputed on the server. 0 when scoring is not used.
submission.outcome
string or null
The heading of the outcome (score range) that matched, exactly as the respondent saw it. null when no range matches or scoring is off.
data
object
One entry per answered question, keyed by Field key (for example email_1, multiple_choice_2). Single-choice and dropdown answers carry the option Value; multiple choice carries an array of values; sliders a number; a Name question arrives as firstname and lastname. Hidden fields are included. Unanswered questions are absent. data.utm holds the captured UTM parameters.
utm
object
The UTM parameters captured from the public link (utm_source, utm_medium, utm_campaign, utm_term, utm_content), repeated at the top level for convenience. Empty object when the link had none.
Headers
content-type
application/json
The body is always JSON.
x-forms-event
form.submission
The event name, same as type in the body.
x-forms-delivery
submission:6f1cβ¦:complete:webhook:0
The idempotency key (same as id in the body). Unique per submission, phase and webhook. Retries of the same delivery reuse it.
x-forms-timestamp
1787364784
Unix time in seconds when the delivery was created. Use it to reject stale requests if you want replay protection.
X-Forms-Signature
sha256=b5b239β¦
Present only when a Signing secret is set: sha256= + hex HMAC-SHA256 of the raw body. See Verify the signature.
Header names are case-insensitive; most frameworks expose them lowercase.
Test deliveries
Send test posts the same envelope with sample answers so your endpoint sees the real shape. Differences from a real delivery:
idandx-forms-deliveryuse the prefixping:instead ofsubmission:.phaseispartial,submission.idistest-submissionandsubmission.sessionIdistest-session.datacontains"test": trueplus one sample answer per question:sample@example.comfor Email,+15555550123for Phone,https://example.comfor Website,5for Slider,sample-optionfor choice questions,Sample/Respondentfor Name,Sample answerfor everything else.utmis empty.
π‘ Tip: Treat
id(orx-forms-delivery) as the primary key on your side. If your endpoint answers slowly and Dapta Forms retries, you will receive the same key again and can safely skip it.
What's next
Hidden fields & URL prefill: how hidden answers and UTMs get into
data.
Last updated