Typeform

Lightweight, dependency-free, in-memory Typeform Create & Responses API fake for testing code that uses the real @typeform/api-client SDK (and the language-agnostic Typeform REST API).

Default port: 4812

Quick start

import { TypeformServer } from "./services/typeform/src/server.js";

const server = new TypeformServer(4812);
await server.start();
// ... run your app/tests ...
await server.stop();

Point the real client at it via apiBaseUrl:

import { createClient } from "@typeform/api-client";

const typeform = createClient({ token: "parlel", apiBaseUrl: "http://127.0.0.1:4812" });
const forms = await typeform.forms.list();

State is in-memory and ephemeral.

Implemented operations

All routes require Authorization: Bearer <token>; any non-empty bearer token is accepted.

Account

Forms

Responses

Service & inspection operations (parlel extensions)

Access via MCP / preview URL

In a parlel pool, the service is reachable at its preview URL (host/port shown by the pool); set apiBaseUrl to that URL. Through the parlel MCP server, the forms and responses routes are exposed as a tool surface so an AI agent can create forms and read submissions directly.

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

FeatureStatus
GET /me✅ Supported
Forms CRUD (list/create/get/update/delete)✅ Supported
Responses listing✅ Supported
Response seeding (parlel convenience)✅ Supported (parlel extension)
Form runner / real submission flow⟳ Roadmap — responses are seeded
Themes / Images / Workspaces / Webhooks REST resources⟳ Roadmap
Field-level validation rules enforcement◐ Stored, not enforced
Bearer-token validity check✓ By design — Any non-empty credential is accepted — no real secrets needed

Manifest

See services/typeform/manifest.json:

<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

TYPEFORM_TOKEN=parlel
TYPEFORM_API_KEY=parlel
TYPEFORM_HOST=http://parlel-bridge:4812
TYPEFORM_BASE_URL=http://parlel-bridge:4812
<!-- parlel:testenv:end -->