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. INDEX: 1. Endpoints 2. Body shape (preview + create) 3. Field catalogue 4. Dynamic options 5. How to configure end-to-end 6. Key notes 7. Where it fits 8. When to use ================================================================================ 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: { "": "