SurveyMonkey
S
SurveyMonkey

tap-surveymonkey (meltanolabs variant)

SurveyMonkey is an online survey platform for creating and distributing surveys and collecting and analysing responses.

The tap-surveymonkey extractor connects to the SurveyMonkey API v3 to extract your surveys, their full definitions, distribution collectors, collector recipients, individual responses, and address-book contacts. Alongside the raw nested streams it also emits normalized streams that flatten the survey definition and responses into a relational, one-row-per-element shape (survey_pages, questions, question_headings, question_options, sub_questions, response_pages, response_answers) so downstream models do not need warehouse-specific UNNEST/FLATTEN SQL.

Prerequisites

To connect to SurveyMonkey, you authenticate using OAuth2. Use the Connect with SurveyMonkey button to authorize through the Matatika OAuth proxy, which handles token management automatically. The authorizing SurveyMonkey user must have access to the surveys being extracted. The OAuth app requests the surveys_read, collectors_read, responses_read, responses_read_detail and contacts_read scopes. responses_read_detail (full per-question answer detail on the responses/response_answers streams) requires a paid SurveyMonkey plan; on Basic plans, response answer detail is limited.

Data recovery / backfill

The responses, response_pages and response_answers streams replicate incrementally on date_modified, bookmarked against start_date. To backfill or re-sync historical data, lower the start_date, or reset the connection state so the sync restarts from start_date. All other streams are full-table and always re-sync completely.

Note on history. These streams emit the current state of each record. They are not slowly-changing-dimension (SCD type-2) history tables — if you need valid-from/valid-to versioning (e.g. to match a Fivetran history-mode schema), layer that in the warehouse (for example with dbt snapshots).

Available Streams

surveys

All surveys in the account. Parent stream for the other streams.

| Field | Description | |---|---| | id | Unique identifier of the survey | | title | Survey title | | nickname | Survey nickname | | category | Survey category | | language | Survey language | | question_count | Number of questions in the survey | | page_count | Number of pages in the survey | | response_count | Number of collected responses | | folder_id | ID of the folder containing the survey | | date_created | Timestamp when the survey was created | | date_modified | Timestamp when the survey was last modified | | href | API resource URL |

survey_details

The full definition of each survey, including pages and their questions. Synced per survey.

| Field | Description | |---|---| | id | Unique identifier of the survey | | title | Survey title | | question_count | Number of questions in the survey | | page_count | Number of pages in the survey | | response_count | Number of collected responses | | date_created | Timestamp when the survey was created | | date_modified | Timestamp when the survey was last modified | | pages | Array of page objects, each containing its questions |

collectors

Collectors (distribution channels such as web links and email invitations) for each survey. Synced per survey.

| Field | Description | |---|---| | id | Unique identifier of the collector | | survey_id | ID of the parent survey | | name | Collector name | | href | API resource URL |

recipients

Recipients of each collector (the people an email-invite collector was sent to). Synced per collector; web-link collectors have no recipients.

| Field | Description | |---|---| | id | Unique identifier of the recipient | | collector_id | ID of the parent collector | | survey_id | ID of the parent survey | | email | Recipient email address | | phone_number | Recipient phone number, if provided | | survey_response_status | How far the recipient got (not_responded, partially_responded, completely_responded) | | mail_status | Invite delivery status (sent, not_sent, processing) | | custom_fields | Custom contact fields for the recipient | | extra_fields | Extra fields included in the invite message | | remove_link | Unsubscribe link | | survey_link | Link to the survey in the invite | | href | API resource URL |

responses

Individual survey responses, including per-question answers. Synced per survey and incrementally replicated by date_modified.

| Field | Description | |---|---| | id | Unique identifier of the response | | survey_id | ID of the parent survey | | collector_id | ID of the collector the response came through | | recipient_id | ID of the recipient, if applicable | | total_time | Total time spent on the response, in seconds | | ip_address | IP address of the respondent | | response_status | Status of the response (completed, partial, etc.) | | custom_variables | Custom variables passed to the collector | | date_created | Timestamp when the response was created | | date_modified | Timestamp when the response was last modified — replication key | | pages | Array of answered pages and their question answers |

survey_pages

One row per survey page, flattened from survey_details.

| Field | Description | |---|---| | id | Unique identifier of the page | | survey_id | ID of the parent survey | | title | Page title | | description | Page description | | position | Position of the page within the survey | | question_count | Number of questions on the page | | href | API resource URL |

questions

One row per question, flattened from survey_details.

| Field | Description | |---|---| | id | Unique identifier of the question | | survey_id | ID of the parent survey | | page_id | ID of the parent page | | position | Position of the question within the page | | visible | Whether the question is visible | | family | Question family (e.g. single_choice, matrix, open_ended) | | subtype | Question subtype | | forced_ranking | Whether forced ranking is enabled | | href | API resource URL |

question_headings

One row per question heading (questions can carry multiple headings for A/B random assignment). Flattened from survey_details.

| Field | Description | |---|---| | question_id | ID of the parent question | | survey_id | ID of the parent survey | | page_id | ID of the parent page | | heading_index | Ordinal position of the heading within the question | | heading | Heading text | | description | Heading description |

question_options

One row per answer choice, flattened from survey_details.

| Field | Description | |---|---| | id | Unique identifier of the answer choice | | question_id | ID of the parent question | | survey_id | ID of the parent survey | | page_id | ID of the parent page | | position | Position of the choice within the question | | visible | Whether the choice is visible | | text | Answer choice text | | weight | Choice weight, if scored |

sub_questions

One row per matrix subquestion (row), flattened from survey_details.

| Field | Description | |---|---| | id | Unique identifier of the subquestion (row) | | question_id | ID of the parent question | | survey_id | ID of the parent survey | | page_id | ID of the parent page | | position | Position of the row within the question | | visible | Whether the row is visible | | text | Subquestion (row) text |

response_pages

One row per answered page of a response, flattened from responses. Incrementally replicated by date_modified.

| Field | Description | |---|---| | id | ID of the page | | response_id | ID of the parent response | | survey_id | ID of the parent survey | | date_modified | Parent response modification timestamp — replication key |

response_answers

One row per individual answer, flattened from responses down to the answer level. Incrementally replicated by date_modified.

| Field | Description | |---|---| | id | Deterministic surrogate key for the answer | | response_id | ID of the parent response | | survey_id | ID of the parent survey | | page_id | ID of the parent page | | question_id | ID of the parent question | | choice_id | ID of the selected answer choice, if applicable | | row_id | ID of the matrix row, if applicable | | col_id | ID of the matrix column, if applicable | | other_id | ID of the "other" answer option, if applicable | | text | Free-text answer value, if applicable | | date_modified | Parent response modification timestamp — replication key |

contacts

Address-book contacts. Requires the contacts_read scope.

| Field | Description | |---|---| | id | Unique identifier of the contact | | first_name | Contact first name | | last_name | Contact last name | | email | Contact email address | | phone_number | Contact phone number | | status | Contact status | | href | API resource URL |

survey_categories

Survey categories available to the account.

| Field | Description | |---|---| | id | Unique identifier of the category | | name | Category display name |

Settings

Start Date

The earliest response date to sync, in ISO-8601 format (e.g. 2026-01-01T00:00:00Z). Used as the incremental bookmark for the responses stream.

Region

The SurveyMonkey data-residency region your account belongs to, set when the account was created. Selecting the wrong region will cause authentication or lookup failures. If unsure, check with your SurveyMonkey account administrator.

Meltano Cloud Connector

SurveyMonkey connector is available on Meltano. It is built, maintained, supported, and tested by Meltano.

Why Meltano?
Expert supportDirect access to the team that built and maintains Meltano Cloud. Same-day responses during UK business hours. When something breaks, we fix it fast because we know exactly how it works.
Rigorously testedEvery connector goes through comprehensive testing and quality checks before production. Daily monitoring catches issues before they hit your pipelines. We don't just wrap open-source taps and hope for the best. We validate, we test, we maintain.
No maintenance overheadAPI changes. Connector updates. Schema drift. Breaking changes from upstream sources. We handle it all. Your team focuses on using data. Our team focuses on making sure it's there when you need it.
Access to Meltano Slack communityJoin 5,500+ data engineers and analytics practitioners. The community is active, helpful, and always on. Good for quick questions, sharing patterns, and learning what others are building.