
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.
SurveyMonkey connector is available on Meltano. It is built, maintained, supported, and tested by Meltano.