Ticket Form Mode
Embed a smart intake form on your site — paste, voice, and AI extraction built in.
The Keva widget supports three modes — chat, form, and hybrid. The ticket form mode renders a structured submission form instead of (or alongside) the chat panel, with AI-powered intake baked in: paste an email thread or chat log and Keva extracts the subject, body, and customer info automatically.
When to use each mode
chat (default)
Realtime messaging panel — best for conversational support
form
Structured ticket submission — best for detailed bug reports, feature requests
hybrid
Launcher shows a picker — user chooses chat or form
Install
The widget is installed the same way regardless of mode. Add the script tag
to your site and set data-mode:
<script
src="https://widget.keva.support/embed.js"
data-api-key="keva_live_..."
data-mode="form"
data-primary-color="#3b82f6"
async
></script>Or programmatically
window.Keva.init({
apiKey: 'keva_live_...',
mode: 'hybrid',
primaryColor: '#3b82f6',
user: { email: 'customer@example.com', name: 'Jane Doe' },
intakeModes: {
paste: true,
voice: true,
screenshot: true,
recording: false, // e.g. disable screen recording for privacy-sensitive deployments
},
});What the form looks like
- Paste-anything block at the top — customers paste an email thread, chat log, or error message. A single "Extract ticket" button calls Keva's AI which fills in the subject, body, and customer info.
- Voice dictation — a 🎤 Dictate button appears beside the Message label (Web Speech API, Chrome/Edge/Safari). Customers speak, their words stream into the textarea in real time.
- Screenshots — customers can paste, upload, drag-drop, or capture screen screenshots inline. Up to 5 per ticket.
- Screen recording — guided 3-minute screen recording with pre-flight privacy guidance, mic narration toggle, pause/resume, "+2 min" extension.
- Structured fields — email, name, subject, message. The customer can review and edit what Keva extracted before submitting.
- Submit — creates a ticket via
POST /api/v1/widget/ticketswith all attachments, and shows a success state.
Intake modes (per-feature toggles)
Each intake method can be independently turned on or off. All default to on;
omit the intakeModes config entirely to enable everything.
window.Keva.init({
apiKey: 'keva_live_...',
mode: 'form',
intakeModes: {
paste: true, // paste-and-extract (default)
voice: true, // voice dictation (default)
screenshot: true, // paste/upload/capture screenshots (default)
recording: false, // 3-min screen recording — disable for regulated industries
},
});When to disable specific modes:
- Screen recording off for medical, legal, or financial workflows where customers may inadvertently record sensitive screens.
- Screenshot off for similar reasons if recording is OK but images aren't.
- Voice off for sites where speech recognition is inappropriate (silent offices, libraries).
- Paste off for simpler workflows where you want customers to describe the issue themselves rather than pasting prior conversation.
Configuration
API key scopes
Your API key needs either tickets:write or widget:write scope to accept
ticket submissions. Create a key in Settings → API Keys with the
appropriate scope.
Events
Subscribe to widget events programmatically:
const keva = window.Keva.instance;
keva.on('form-extracted', (data) => {
console.log('Keva filled these fields:', data.filled);
});
keva.on('form-submitted', (data) => {
console.log('Ticket created:', data.ticketId);
});Rate limits
To protect against abuse when embedded on public pages:
- 5 AI extractions per minute per API key
- 10 attachment uploads per hour per API key
- 10 ticket submissions per hour per IP address
- 20 ticket submissions per email per day
Customers hitting a limit see a friendly "please try again later" message.
Security & SOC 2
- All media uploads go directly to S3 via short-lived (10-min) presigned URLs
- Storage uses SSE-KMS encryption with a customer-managed key
- CloudTrail logs every upload + download for audit trail
- Retention: 2 years by default, matches your ticket retention policy
- Media flagged for PII (email, phone, card numbers) is stored in a separate, access-restricted path
See the Security section for full SOC 2 Type II details.
Troubleshooting
Widget doesn't appear. Check that your domain is in the allowed origins list on the API key (Settings → API Keys → Edit).
Paste extraction isn't working. The Gemini API key must be configured in Super Admin → AI Settings. Without it, the "Extract ticket" button falls back to submitting the raw pasted text.