Add Typelessity to your website
Set up the widget in the Webappski portal, paste two lines of HTML, and receive booking requests by email or straight into your booking system. You need access to your site’s HTML, an address that should receive the requests, and your site must use HTTPS.
What you need
- Access to the HTML of your website, to paste two lines into a page.
- Where the requests should go: an email address, or the address of your own endpoint (REST).
- A website on HTTPS. Browsers allow the microphone only on a secure page, so on plain HTTP the voice input does not work.
Three steps
Set it up in the portal
Step by step: Your business → Questions → Data & delivery → Messages → Review → Install. Or let your own AI write it: copy our instructions into ChatGPT or Claude with your API docs and paste the answer back.
Paste two lines of HTML
The Install step shows the exact code for your platform. Before you publish, you can try the widget as a customer.
Receive the requests
Each request arrives by email, or as JSON at your own endpoint (REST), shaped by the field mapping in your config.
The code
<script type="module" src="https://typelessity-widget.vercel.app/widget.js"></script> <typelessity-widget api-url="https://typelessity.vercel.app"></typelessity-widget>
Where the requests go
By email
The email goes to the address you set. The subject is “New lead from <your business name>”, and the body has one line per detail: the field’s key and its value, for example date: 2026-10-20.
The request is saved before it is sent. If the email cannot be sent, it is retried once a day, up to 5 attempts.
To your endpoint (REST)
The booking details go to your address as JSON: POST, or PUT if you set it. Only HTTPS addresses are used, and private network addresses are blocked.
Every request carries the headers you set, plus Content-Type, X-Idempotency-Key and X-Request-ID. The X-Idempotency-Key is the same on every retry of one request, so your system can tell a repeat from a new booking.
A 502, 503 or 504 answer, or a network error, is retried 3 times by default, with exponential backoff.
An example body; the shape follows your field mapping:
{ "service": "Balayage + haircut",
"hair_length": "Long",
"date": "2026-10-20",
"time_window": "Morning",
"stylist": "Anna K. · Colour · Tue 09:30",
"name": "Kasia",
"phone": "+48 500 100 200" }What your customer sees
If your system accepted the request, the customer sees a confirmation with the ID your system returned. If it went by email, the customer sees “Request Received” and that you will contact them to confirm.
If your site sets a Content-Security-Policy
Allow these in the policy of your site. The addresses are the ones shown in the Install step.
script-src https://typelessity-widget.vercel.app connect-src https://typelessity.vercel.app font-src https://typelessity-widget.vercel.app img-src data: style-src-attr 'unsafe-inline'
Without img-src data: the consent checkmarks do not show.
Until the next widget release the widget requests Google Fonts unless your Content-Security-Policy blocks it; the CSP above blocks it.
And this header, so the browser lets the widget use the microphone:
Permissions-Policy: microphone=(self)