One form. Wherever you need it.
Create a form in your workspace, add the website origins you use, and publish. The hosted page and every integration use the same configuration.
Any website
Copy the snippet from Install & versions. Add your site’s exact HTTPS origin under Delivery & domains before embedding.
<div data-livetyped="YOUR_FORM_ID"></div> <script src="https://livetyped.com/sdk/v1/embed.js" defer></script>
The embed adjusts its height and keeps page styles separate. Multiple forms can coexist. Microphone access depends on the browser, host permissions policy, and the visitor’s permission.
JavaScript
Load the script, then mount where you need it. Call destroy when your view unmounts.
const form = LiveTyped.mount('#contact', {
formId: 'YOUR_FORM_ID',
title: 'Contact our team',
onSubmitted: ({ submissionId }) => console.log(submissionId)
});
// Later: form.destroy();React
Download the React component, put it in your project, and import it.
<LiveTyped formId="YOUR_FORM_ID" title="Contact our team" />
Framer
Download the Framer code component. Create a new code file in Framer, paste the component, and add it to your page. Set its Form ID, then add both your preview and production origins to the form’s allowed websites. The canvas shows a placeholder; Preview and published pages load the form.
The wrapper is supplied as source in this pilot. A published Framer marketplace component and physical-device compatibility are still to be verified.
Submissions
Every successful submission is stored before the browser receives a receipt. The same visitor session can create only one response. Retrying a request returns the existing receipt. Only the current draft and structured answers are submitted; the application does not send keystroke history.
Signed webhooks
Set a public HTTPS endpoint in Delivery & domains. Copy the signing secret and keep it on your server. Verify the HMAC-SHA256 over timestamp + '.' + rawRequestBody against X-LiveTyped-Signature using constant-time comparison. Reject timestamps older than five minutes. Deduplicate using X-LiveTyped-Event.
{
"id": "stable-event-id",
"type": "submission.created",
"createdAt": "ISO timestamp",
"data": {
"id": "submission-id",
"formId": "form-id",
"versionId": "published-version-id",
"values": { "email": "maya@example.com" },
"message": "The visitor’s current message"
}
}Return a 2xx status within ten seconds. Delivery can occur more than once. Failed deliveries retry with increasing delays; terminal failures appear in your inbox with a retry action. Redirects are not followed.
Versions and updates
Save draft does not change the live form. Publish creates an immutable version. An active visitor session keeps its starting version for up to two hours. Making an older version live affects new sessions. Pausing the form blocks new and existing submissions until it is published again.
Voice and interpretation
Jev helps classify uncertain options from the form’s approved choices. It does not generate arbitrary answers. The visitor can check every interpretation in Details before sending.
Hosted voice sends bounded phrases to Cloudflare Workers AI. LiveTyped does not store audio. The transcript becomes editable text, and completed transcript results are cached for up to a day for retry handling. Draft text may be sent to Jev when interpretation is enabled. Turning either capability off leaves typing and Details usable.
Automatic voice can load Moonshine on compatible isolated hosted pages. This path is experimental. First use downloads a speech model. If startup fails, the page offers a fresh hosted recording; it does not silently upload previously captured local audio. Ordinary embeds use hosted voice when isolation is unavailable.
Pilot boundaries
The platform is invitation-only while we measure reliability and cost. Subscription billing, email notifications, attachments, and marketplace publishing are not enabled. Hosted voice currently targets English. Real microphones, accents, mobile browsers, and real Framer-site integration need pilot validation.