Let your customers import the forms they already have: intake PDFs, consent Word docs, a page on their old site. Pufflet turns them into structured JSON your form editor can use.
Forms as written, not rewritten.
Drop a file here, or
PDF, DOCX, HTML, Markdown, text · 25 MB
No form handy? Try ours on the live API.
Original wording and structure are preserved. Uncertain or unsupported elements are surfaced for review, not silently omitted.
Show-when rules, Other follow-ups, required flags and page breaks return as structure, not sentences.
Declare what your editor supports; anything outside it is downgraded on purpose and flagged. Three mapping tables turn the JSON into your editor's element types.
PDF, DOCX, HTML and plain text, by upload or public URL.
One JSON document per import: the form itself, a review note for every judgement call, a verification verdict, and what the source turned out to be. Here is a piece of one.
{
"form": {
"version": "1",
"title": "Patient intake",
"sections": [
{ "id": "s2", "heading": "Insurance", "description": null, "items": [
{ "id": "q7", "kind": "single_choice",
"label": "Do you have coverage through an employer?",
"description": null, "required": true, "show_when": null,
"choices": ["Yes", "No"], "other": null },
{ "id": "q8", "kind": "short_answer", "label": "Policy number",
"description": null, "required": null, "format": null,
"show_when": { "question": "q7", "operator": "equals", "value": "Yes" } },
{ "id": "q9", "kind": "short_answer", "label": "Attach a photo of your card",
"description": null, "required": null, "format": null, "show_when": null }
] }
]
},
"review_notes": [
{ "code": "kind_downgraded", "item_id": "q9",
"message": "The original was a file upload. This editor does not support uploads, so it came through as a short answer." }
],
"verification": { "status": "needs_review" },
"source": { "format": "pdf", "page_count": 3, "char_count": 4812 }
}Field names and structure are the same for every import, whatever the document was.
An integration is three things: the config you send with a request, a mapping from the JSON into your editor's own vocabulary, and the review notes you show your users. Here's what our editor uses.
Our form builder has its own vocabulary, like yours. A small mapping carries the imported JSON into it. This is the mapping it runs on.
| In the JSON | In this builder | Notes |
|---|---|---|
form.title | Text · Title, first element of page 1 | Editable and removable like any element. |
form.description | Text · Body, after the title | |
sections | A page break before every section after the first | The preview shows Page x of y. |
section.heading / section.description | Text · Title / Body at the top of that page | |
heading | Text · Subtitle | |
explanation | Text · Body | |
short_answer | Question · Text | format hint (email / phone / web address) kept |
long_answer | Question · Textarea | |
single_choice | Question · Single select | Exactly Yes / No with no Other option becomes Yes/No. |
multi_choice | Question · Multi select | |
date / time / number | Question · Date / Time / Number | |
rating | Question · Rating scale (from, to, end labels) | |
matrix | Question · Matrix / grid (rows, columns, one or many per row) | |
ranking | Question · Ranking | |
signature | Question · Signature | |
file_upload | Never received | Not in this builder's supports list, so the API downgrades it to a short_answer and adds a kind_downgraded note. |
unknown_question | Question with no type chosen | The pipeline's note is shown; pick a type. |
description | Helper text | Shown only when the question has one. |
required (true / false / null) | Required checkbox | false and null both show unchecked; an untouched value writes back unchanged. |
other { label, prompt, input } | Include Other: the option's wording and its answer box | prompt (a caption for the box) is carried through; it is only set when a follow-up question was merged into the option, which this page's config does not ask for. |
show_when | Conditional rule: show when <question> is/includes <value> | The reserved value "other" means the Other option. |
ids | Kept as element ids | Review notes point at elements by id. |
Converting a document means reading it, so the honest version of this page starts with where it goes. Everything below describes the API this page is calling right now.
Reviewing us on behalf of a customer? Send the questionnaire to the address below and you will get a straight answer, including to anything this page does not cover.
Includes 50 conversion credits. Additional credits from US$1. Volume terms for platform integrations.