Skip to main content
Version: Next

Http-Typeform

Typeform source connector

Description​

Reads the responses of one form from the Typeform Responses API (GET /forms/{form_id}/responses). Built on connector-http-base. Batch mode only. Version 1 reads responses only; forms, workspaces, webhooks, OAuth and flattening answers into columns are not supported.

Key Features​

  • Batch
  • Stream
  • Exactly-once
  • Column projection
  • Parallelism

Options​

NameTypeRequiredDefaultDescription
api_keyStringYes-Typeform personal access token with the responses:read scope (raw token, no Bearer prefix).
form_idStringYes-ID of the form to read. Letters, digits, _ and - only.
base_urlStringNohttps://api.typeform.comAccounts on Typeform's EU data center use https://api.eu.typeform.com or https://api.typeform.eu.
page_sizeIntNo100Responses per page, 1 to 1000 (Typeform's maximum).
sinceStringNo-Only responses since this time, inclusive. Unix seconds or ISO 8601 UTC, for example 2026-01-01T00:00:00.
untilStringNo-Only responses until this time, inclusive. Same format as since.
response_typeStringNo-Comma-separated, for example partial,completed. Typeform returns completed responses when this is not set.
retryIntNo3Max retries on HTTP 429 and 5xx.
retry_backoff_multiplier_msIntNo100Backoff multiplier in milliseconds.
retry_backoff_max_msIntNo10000Maximum backoff time in milliseconds.

api_key​

Sent only in the Authorization: Bearer <token> header, never in query parameters. The connector never logs headers or the config, and persists no state, so the token does not reach checkpoints. Whether the engine masks api_key when it logs the job config is outside this connector.

since / until / response_type​

Passed to Typeform as is. For completed responses Typeform filters since and until on submitted_at; for other response types it uses a different timestamp (see Typeform's API reference).

retry​

Requests are spaced at least 500 ms apart, because Typeform allows 2 requests per second per account. HTTP 429 and 5xx are retried with a backoff that doubles from retry_backoff_multiplier_ms up to retry_backoff_max_ms. Retry-After is not honored.

Output columns​

ColumnTypeNotes
response_idSTRINGTypeform response id
landing_idSTRING
tokenSTRINGUsed as the paging cursor
landed_atSTRINGISO 8601 timestamp
submitted_atSTRINGISO 8601 timestamp; null for partial responses
answersSTRINGThe answers array as a JSON string, unchanged. NULL when the response has no answers (empty array or missing).
hiddenSTRINGThe hidden fields object as a JSON string, unchanged. {} when the form has no hidden fields; NULL when missing.

Answer shapes differ by question type, so answers is kept as raw JSON. Use a JSON transform or the sink's JSON functions to extract the fields you need.

Example​

env {
parallelism = 1
job.mode = BATCH
}

source {
Typeform {
api_key = "<PERSONAL_ACCESS_TOKEN>"
form_id = "<FORM_ID>"
since = "2026-01-01T00:00:00"
plugin_output = "typeform_responses"
}
}

sink {
Console {
plugin_input = "typeform_responses"
}
}

Notes​

Each run is a bounded snapshot of the form's responses, optionally narrowed by since and until. Pages are read newest first: the token of the last response on a page is sent as the before cursor, and an empty page ends the read. Responses submitted during the read arrive at the newest end and do not shift the pages being read. Sort order is not configurable, because the before cursor depends on Typeform's default order.

No incremental state is stored. After a failure, a restarted job re-reads from the first page and may emit rows that were already sent. Every row includes response_id, which a downstream sink can use to deduplicate or upsert, but the connector provides no delivery guarantee.

Typeform notes that responses from roughly the last 30 minutes may not be returned yet.

The whole form is read in one uninterrupted pass, with a short pause between requests, so on a very large form checkpoint triggering waits until the read finishes.

ChangeCommitVersion
[Feature][connector-http-typeform] Add Typeform source connectorhttps://github.com/apache/seatunneldev