Quickstart B — Share a form and receive submissions
Get a published form in front of customers, and get the completed submissions back.
Once a form is published it has a link. Send that link to a customer and they can fill the form in — that's the whole of sharing it.
What happens next is the part worth setting up. Every completed form shows up in your InsurGrid dashboard automatically. If you also want the submission delivered to your own systems — every answer, the contact details, any uploaded files, and the filled ACORD PDFs — you register a webhook endpoint, and InsurGrid posts each one to you as it arrives.
This page covers both halves. About 20 minutes for the webhook half; sharing the link takes a minute.
What you'll need
An InsurGrid account with at least one published form.
For the webhook half: an HTTPS address InsurGrid can reach, that accepts
POST. A deployed server is simplest — if you're working on your laptop, it isn't reachable from the internet, so put a tunnel in front of it (how).
API
https://phoenix-staging.insurgrid.com
https://phoenix.insurgrid.com
Form links
https://link-staging.insurgrid.com
https://link.insurgrid.com
Part one — share the form
Get the link
Every published form has a shareUrl. It's in the dashboard's Forms section, or fetch it:
curl 'https://phoenix-staging.insurgrid.com/api/v1/forms' \
-H 'Authorization: Bearer YOUR_API_KEY'https://link-staging.insurgrid.com/jane-smith/form/f_9c2a7b1e4d/apartment-intake-acme⚠️
shareUrlisnulluntil the form is published. Drafts and archived forms have no link at all. Publish first, withPUT /api/v1/forms/{id}/publish.
The first segment is the slug of the agent who created the form, and that's who submissions through this link are credited to. It appears again as agent in every webhook.
Give it to people
It's an ordinary web address, so use it however suits you — email or text it to a customer, put it behind a button on your website, print it as a QR code. InsurGrid hosts the page; nothing needs registering beforehand.
Showing it inside your own page
If you'd rather the form appeared within your product than on a page of its own, put the link in an <iframe> and add ?embed=1. That flag strips InsurGrid's header and page furniture, so only the form shows — no InsurGrid branding around it.
Give the frame a height that suits your layout — the form doesn't message your page, so there's nothing to listen for and nothing to resize against. Everything else works exactly as it does through a plain link.
Part two — receive the submissions
When someone completes the form, the response lands in your InsurGrid dashboard straight away. That happens for every account with nothing to set up — you can read the answers, download any files, and review the submission there.
To get the same submission into your own systems, register a webhook endpoint. InsurGrid then posts each completed submission to your server as a form-submission event, carrying the contact details, every answer, links to any uploaded files and, for ACORD-mapped forms, a download of the filled PDFs.
The rest of this page is that setup.
Register your endpoint
In the InsurGrid webhooks dashboard:
Add your endpoint — a publicly reachable HTTPS URL that accepts
POST. Each account has one.Choose your events — tick
form-submission· intake & ACORD. You can receiveclient-submission(policy data) on the same endpoint too.Choose how InsurGrid authenticates to you — see below.
Send a test event to check your handler before real traffic arrives.
How InsurGrid proves it's InsurGrid
You pick this per endpoint; it isn't fixed:
Default signature
Every request signed by InsurGrid. No setup needed.
Custom signature
An HMAC-SHA256 signature of the body, in a header you name, signed with a secret you provide.
API key
Your key, in a header or query parameter you name.
Bearer token
Authorization: Bearer <token>
Basic auth
Authorization: Basic <credentials>
We recommend Custom signature, API key or Bearer token, so your server can reject anything it can't verify.
A staging secret never validates a production event, and vice versa.
Acknowledge first, work second
Return any 2xx as soon as the event arrives — the body is ignored. Do the slow work after you've responded.
Anything else — another status, a timeout, no response — counts as a failed delivery and is retried. You can also resend any event from the dashboard.
Two behaviours to design for:
Events can arrive more than once. Use
data.submission_idto skip ones you've handled.Order isn't guaranteed. If sequence matters, sort on
data.submitted_at.
What the event looks like
Every event has the same envelope — check topic first, since one endpoint can receive several kinds:
Inside data
submission_id
integer
Unique id for this submission. Your de-duplication key.
trace_id
string | null
The form session that produced it. Quote it if you contact support.
submitted_at
string
When it was submitted, UTC ISO 8601.
form.id
integer
Form id.
form.public_id
string
The public id used in links and embeds.
form.name
string
Form name.
form.insurance_line
string
personal or commercial.
form.external_user_id
string | null
Your own user id, if the form was created through the Forms API with one.
agent
object
Who it's credited to: id, name, email. Name and email can be null.
contact
object
The submitter's name, email, phone. Filled from questions carrying a field_mapping — see the warning below. Any can be null.
answers
array
One entry per question. See below.
acord
object
ACORD output. See below.
⚠️
contactonly fills if the questions are tagged. InsurGrid reads it from questions carrying afield_mappingofFullName,Phone— never from a question's type or label. A form built through the API with its ownsteps, and no tags, deliverscontact: {name: null, email: null, phone: null}on every submission, with the answers still present inanswers[]. See Keeping the contact block populated.
Answers
answers lists every question on the form, in order — including ones nobody answered, which carry value: null.
question_id
Stable id. Map on this, not label — labels get edited, ids don't.
label
The question text as shown to the submitter.
type
The question type.
value
The answer. Shape depends on type.
columns
data_table only — the table's columns (id, label, type).
Type
value
short_text, long_text, email
string
number
number
date
date string
dropdown, single_choice
string — the option they picked
multi_choice
array of strings
address
object: line1, line2, city, state, zip, country
data_table
array of rows, each keyed by column id
file_upload
array of { filename, content_type, url }
⚠️ File links are public and permanent — treat them as sensitive. The
urlon afile_uploadanswer, andacord.archive_url, are unsigned links to a public bucket. They don't expire, and anyone who has the URL can download the file without authenticating. Since these are documents your customer uploaded, don't paste one into a ticket, a chat, an email or a log you wouldn't paste the document itself into.Download and store what you need when the event arrives: there is no endpoint to re-fetch a submission, and a file's
urlisnullonce the document is no longer available.
ACORD
acord.is_acord_ready
true when the form is mapped to ACORD forms.
acord.form_ids
The ACORD numbers filled from this submission, e.g. ["125", "140"]. Empty when not ACORD-ready.
acord.archive_url
A ZIP of the filled PDFs. Present only when ACORD-ready and the archive built — treat as optional.
Handling a repeat delivery
Next steps
Embed the form builder — let your users build their own forms
