SOURCE_ID: import_from_typeform NAME: Import Typeform Responses CATEGORY: First-party Import responses to a Typeform form into Floqer — backfill the existing responses and keep importing new submissions as they arrive. Each response becomes a row whose fields are the form answers you select. Imported rows become available to your Floqer workflows for enrichment, scoring, outreach, and the like. 1. ENDPOINTS Source identifier (used in every endpoint path): `import_from_typeform`. POST /api/v1/sources/import_from_typeform/preview Scope: sources:read Returns a sample page of responses for the chosen form / fields, without creating anything. Use this to validate the form and field selection and inspect row shape before committing. POST /api/v1/sources/import_from_typeform Scope: sources:write Creates the source, imports existing responses immediately (when `pull_existing`), and keeps importing new submissions as they arrive. Returns `source_instance_id` (the new source's UUID). POST /api/v1/sources/import_from_typeform/options/ Scope: sources:read Resolves dynamic option values for a field: `form_id` and `form_fields` (see §4). GET /api/v1/sources//data Scope: sources:read Paginated rows imported into the created source. `` is the UUID returned by Create. Query: `page_no` (default 1), `page_size` (default 20, max 200). Source-agnostic; see concepts.txt §10. POST /api/v1/sources//sync Scope: sources:write Connects the created source to a workflow and (by default) backfills it with the source's current rows. `` here is the UUID returned by Create. Body: { workflow_id, field_mapping, push_existing?, run? } — `field_mapping` keys are `input.` references on the target workflow, values are the source fields to pull. This step is source-agnostic; see concepts.txt §10 for the full shape. PATCH /api/v1/sources//status Scope: sources:write Pause or resume the source by UUID. Body: {"status": "active" | "paused"}. Source-agnostic. Every endpoint for this source first verifies the API-key user has an active Typeform connection. Missing connection → 424. 2. BODY SHAPE (PREVIEW + CREATE) Field names are snake_case. Unknown top-level keys are rejected with 400 — the body is strict. Preview accepts: form_id required: the Typeform form ID form_fields required: non-empty object mapping field id → display label Create accepts all the preview fields plus: name required: display name for the new source pull_existing boolean (or "true"/"false"); optional (backfill existing responses on create) 3. FIELD CATALOGUE form_id (string) — required The Typeform form whose responses you want to import. Resolve it with the `form_id` dynamic-options call (§4). form_fields (object) — required A non-empty object mapping each Typeform field ID to the display label you want that answer to appear under on imported rows: { "": "