Widget

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

  1. 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.
  2. 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.
  3. Screenshots — customers can paste, upload, drag-drop, or capture screen screenshots inline. Up to 5 per ticket.
  4. Screen recording — guided 3-minute screen recording with pre-flight privacy guidance, mic narration toggle, pause/resume, "+2 min" extension.
  5. Structured fields — email, name, subject, message. The customer can review and edit what Keva extracted before submitting.
  6. Submit — creates a ticket via POST /api/v1/widget/tickets with 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.